#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn=8;
bool check[1<<maxn]; // 记录该数字是否合法 (没有连续的奇数个0)
int dp[10][1<<maxn];

void solve(){
	for(int i=0;i<(1<<maxn);i++){ // 先找出哪些数符合条件, 没有连续的奇数个 0
		int cnt=0;
		for(int j=0;j<maxn;j++){ // 判断每一位
			if((i>>j)&1){ // 是 1
				if(cnt&1){ // 奇数个 0
					check[i]=false;
					break;
				}
			} else { // 是 0
				cnt++;
			}
		}
		if(cnt&1){ // 奇数个
			check[i]=false;
		} else {
			check[i]=true;
		}
	}
	
	dp[0][0]=1;
	// 开始覆盖
	// 总体思路就是一列一列的覆盖
	// 每行用 0/1 表示, 1 表示 横着, 并往下一个伸出
	// 0 表示竖着放, 或者由前一列伸出
	for(int i=1;i<=maxn;i++){ // 每一列
		for(int j=0;j<(1<<maxn);j++){ // 当前列
			for(int k=0;k<(1<<maxn);k++){ // 前一列
				if((j&k)==0 && check[j|k]){ // 不能重叠且不能有奇数个 0
					dp[i][j]+=dp[i-1][k];
				}
			}
		}
	}
	// 最终结果, 最后一列的不能有 1 , 即不能向下一个伸出, 因为会越界
	cout<<dp[maxn][0]<<'\n';
}


signed main(){
	ios::sync_with_stdio(0), cin.tie(0),cout.tie(0);
	solve();
	return 0;
}
